import cv2
import numpy as np

img = cv2.imread("../images/color.png")
img = cv2.resize(img, (0,0), fx=0.3, fy=0.3)
img_gary = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

img_canny = cv2.Canny(img_gary, 30, 70)
# cv2.imshow("img_canny", img_canny)

# 霍夫圆变换
circles = cv2.HoughCircles(
    img_canny,
    method=cv2.HOUGH_GRADIENT,      # 霍夫梯度下降法 （用来减少计算量）
    dp=1,   # 累加器分辨率与图像分辨率的之比（1表示相同分辨率）
    minDist=10,     # 检测到的圆心之间的最小距离     （小于这个距离被认为是同一个圆）
    param1=100,     # Canny边缘检测的高阈值 （低阈值为其一半）
    param2=30,      # 累加器阈值 （值越大，表示在霍夫空间中相交的线越多，检测到的圆越可靠）
    minRadius=20,   # 最小半径
    maxRadius=150   # 最大半径
)
print(circles)

hough_img = np.zeros_like(img, dtype="u1")
if circles is not None:
    # 转换数据类型
    circles = np.uint16(np.around(circles))
    print(circles)
    # 循环遍历 绘制圆心 和 圆形
    for cir in circles[0,:]:
        # 解包 x y r
        x, y, r = cir
        # 绘制圆心
        cv2.circle(hough_img, (x,y), 2, (255,0,0), -1)
        # 绘制圆
        cv2.circle(hough_img, (x,y), r, (0,0,255), 2)

img_stack = np.hstack([img, hough_img])
cv2.imshow("img_stack", img_stack)
cv2.waitKey(0)